import { get, post } from '@/utils/modules/request'
import { API_BASE_URL } from '@/config'
import { getToken } from '@/utils/auth'

// 获取模型列表
export const getModelList = params => get('/data-analysis-api/chat/getModelList', params)

// 获取会话列表
export const getChatList = params => get('/data-analysis-api/chat/sessionList', params)

// 删除会话
export const delChat = params => post('/data-analysis-api/chat/delSession', params)

// 删除全部会话
export const delAllChat = params => post('/data-analysis-api/chat/delAllSession', params)

// 会话记录
export const getChatHistory = params => get('/data-analysis-api/chat/chatHistory', params)

// 创建会话ID
export const createSessionid = params => get('/data-analysis-api/chat/generateSessionId', params)

/**
 * 上传图片
 * @param {File} file - 图片文件
 * @returns {Promise} 上传结果，返回图片URL
 */
export const uploadImage = (filePath) => {
  return new Promise((resolve, reject) => {
    const token = getToken()

    uni.uploadFile({
      url: `${API_BASE_URL}/image/upload`,
      filePath: filePath,
      name: 'file',
      header: {
        'Authorization': token ? `Bearer ${token}` : '',
        'source-client': 'miniapp',
      },
      success: (res) => {
        try {
          const data = JSON.parse(res.data)
          if (data.code === 200) {
            resolve(data)
          } else {
            reject(new Error(data.message || '上传失败'))
          }
        } catch (error) {
          reject(new Error('解析响应失败'))
        }
      },
      fail: (error) => {
        reject(error)
      }
    })
  })
}

/**
 * 提交用户反馈
 * @param {Object} data - 反馈数据
 * @param {string} data.type - 反馈类型（中文）
 * @param {string} data.content - 反馈内容
 * @param {string} data.mobile - 联系方式（可选）
 * @param {Array<string>} data.images - 图片URL数组（可选）
 * @returns {Promise} 提交结果
 */
export const submitFeedback = data => post('/user/submitFeedback', data)

// AI 对话接口（旧版本，非流式）
// export const chatWithAi = data => post('/chat/chatWithAiV2', data)

/**
 * AI 对话接口（流式返回）
 * @param {Object} data - 请求数据
 * @param {Function} onMessage - 接收消息的回调函数
 * @param {Function} onError - 错误回调函数
 * @param {Function} onComplete - 完成回调函数
 * @returns {Object} - 包含 abort 方法的对象，用于取消请求
 */
export const chatWithAiStream = (data, onMessage, onError, onComplete) => {
  return new Promise((resolve, reject) => {
    const token = getToken()
    let buffer = '' // 缓存未完成的数据
    let lastUpdateTime = 0 // 上次更新时间
    const UPDATE_INTERVAL = 50 // 更新间隔（毫秒），控制打字机速度
    
    const requestTask = uni.request({
      url: `${API_BASE_URL}/chat/chatWithAiV2`,
      method: 'POST',
      data: data,
      header: {
        'Content-Type': 'application/json',
        'Authorization': token ? `Bearer ${token}` : '',
        'source-client': 'miniapp',
      },
      enableChunked: true, // 开启分块传输
      responseType: 'text', // 以文本形式接收数据
      
      success: (res) => {
        console.log('SSE 请求成功')
        
        // 处理接收到的完整数据
        if (res.statusCode === 200) {
          const responseText = res.data
          
          // SSE 格式：每个数据片段用 \n\n 分隔，格式为 "data:内容"
          // 按 \n\n 分割数据片段
          const chunks = responseText.split('\n\n')
          let fullContent = ''
          
          for (let chunk of chunks) {
            chunk = chunk.trim()
            
            // 跳过空行
            if (!chunk) continue
            
            // 解析 data: 开头的行
            if (chunk.startsWith('data:')) {
              // 提取 data: 后面的内容
              const content = chunk.substring(5).trim()
              
              // 跳过空内容和 [DONE] 标记
              if (!content || content === '[DONE]') continue
              
              // 累加内容到缓冲区
              buffer += content
              fullContent += content
              
              // 节流：每隔一定时间才更新一次视图，避免频繁回调
              const now = Date.now()
              if (onMessage && (now - lastUpdateTime >= UPDATE_INTERVAL || buffer.length >= 10)) {
                onMessage(buffer, fullContent)
                buffer = '' // 清空缓冲区
                lastUpdateTime = now
              }
            }
          }
          
          // 发送剩余的缓冲区内容
          if (buffer && onMessage) {
            onMessage(buffer, fullContent)
          }
          
          
          // 完成回调
          if (onComplete) {
            onComplete(fullContent)
          }
          
          resolve({ code: 200, data: { content: fullContent } })
        } else {
          const error = new Error(`请求失败: ${res.statusCode}`)
          if (onError) {
            onError(error)
          }
          reject(error)
        }
      },
      
      fail: (err) => {
        console.error('SSE 请求失败:', err)
        const error = new Error(err.errMsg || '网络请求失败')
        if (onError) {
          onError(error)
        }
        reject(error)
      }
    })
    
    // 返回可以取消请求的方法
    resolve({
      abort: () => {
        if (requestTask) {
          requestTask.abort()
        }
      }
    })
  })
}

// 获取聊天历史记录列表 (分页)
export const getChatHistories = (pageNo = 1, pageSize = 10, sessionId = null) => {
  console.log(pageNo, pageSize, sessionId)

  const params = {
    pageNo,
    pageSize,
  }
  
  // 如果有 sessionId，添加到参数中
  if (sessionId) {
    params.sessionId = sessionId
  }

  return get('/chat/getChatHistories', {
    data: params,
  })
}

// 获取历史会话列表 (分页)
export const getChatSessions = (pageNo = 1, pageSize = 10) => {
  return get('/chat/getChatSessions', {
    data: {
      pageNo,
      pageSize,
    },
  })
}

// 获取用户当前的AI聊天次数
export const getUserChatCount = () => {
  return get('/chat/getUserChatCount')
}

/**
 * 获取AI分析结果
 * @param {Object} data - 请求参数
 * @returns {Promise} AI分析结果
 * @description 返回的数据包含：
 *  - executeTime: 执行时间
 *  - title: 分析标题
 *  - content: 分析内容
 *  - timestamp: 时间戳
 */
export const getAiAnalysis = (data) => get('/chat/getAiAnalysis', { data })
